﻿using System;
using System.IO;

namespace DEMM.Dependency
{
    public class ArgsData
    {
        public enum CheckFlags : UInt16
        {
            Disaster    = 0x0000,   // 输入格式全部不符

            InputCorr   = 0x0001,   // 输入路径符合格式
            OutputCorr  = 0x0002,   // 输出路径符合格式
            TypeCorr    = 0x0004,   // 输出类型符合格式
            MethodCorr  = 0x0008,   // 采样方法复合格式
            SizeCorr    = 0x0010,   // 像元大小符合格式

            Perfect     = 0x001f,   // 格式全部正确
        }

        // 输入数据路径
        // 必须是存在的文件
        private string pathInput;
        // 输出数据路径
        // 父目录必须存在，自身必须是个文件（不管是否存在）
        private string pathOutput;
        private string outType;     // 输出数据类型
        private string transMethod; // 转换方法
        private double cellSize;    // 像元大小

        public ArgsData()
        {
            pathInput = "";
            pathOutput = "";
            outType = "";       // FLOAT | INT
            transMethod = "";   // LINEAR | NATURAL_NEIGHBORS
            cellSize = 30.0;
        }

        public void SetPathInput(string path)   { pathInput = path; }
        public void SetPathOutput(string path)  { pathOutput = path; }
        public void SetOutType(int typeID)     {
            if (typeID == 0) outType = "FLOAT";
            else if (typeID == 1) outType = "INT";
            else outType = "";
        }
        public void SetTransMethod(int methodID) {
            if (methodID == 0) transMethod = "LINEAR";
            else if (methodID == 1) transMethod = "NATURAL_NEIGHBORS";
            else transMethod = "";
        }
        public void SetCellSize(double size)    { cellSize = size; }

        public string GetPathInput()    { return pathInput; }
        public string GetPathOutput()   { return pathOutput; }
        public string GetOutType()      { return outType; }
        public string GetTransMethod()  { return transMethod; }
        public double GetCellSize()     { return cellSize; }
        public string GetCellSizeStr()  { return cellSize.ToString(); }

        // 设置输出路径的后缀名
        // \param ext: 后缀名，不包括“.”
        public void SetPathOutputExt(string ext)
        {
            if (Path.GetExtension(pathOutput) == "")
            {
                pathOutput += "." + ext;
            }
        }
        // 检查所有参数
        public CheckFlags Check()
        {
            CheckFlags flag = CheckFlags.Disaster;

            if (Directory.Exists(pathInput))
            {
                flag |= CheckFlags.InputCorr;
            }

            if (File.Exists(pathOutput))
            {
                flag |= CheckFlags.OutputCorr;
            }
            // 不是一个存在的文件和目录，则视为此路径指向一个不存在的文件
            else if (!Directory.Exists(pathOutput))
            {
                flag |= CheckFlags.OutputCorr;
            }

            if (outType != "")
            {
                flag |= CheckFlags.TypeCorr;
            }

            if (transMethod != "")
            {
                flag |= CheckFlags.MethodCorr;
            }

            if (cellSize > 0) flag |= CheckFlags.SizeCorr;
            
            return flag;
        }
        // ================================================
        // 以下的检查函数只检查某一个参数
        // ================================================
        public bool CheckInputPath()
        {
            if (!Directory.Exists(pathInput)) return false;

            return true;
        }

        public bool CheckOutputPath()
        {
            if (File.Exists(pathOutput))
            {
                return true;
            }
            // 不是一个存在的文件和目录，则视为此路径指向一个不存在的文件
            else if (!Directory.Exists(pathOutput))
            {
                return true;
            }
            return false;
        }
    }
}
